package interfaceTest;

interface USB {
    int MAX_DEVICES = 5;

    void openDevice();

    void closeDevice();
}

class Mouse implements USB {
    @Override
    public void openDevice() {
        System.out.println("打开鼠标");
    }

    @Override
    public void closeDevice() {
        System.out.println("关闭鼠标");
    }

    public void clink() {
        System.out.println("点击鼠标");
    }
}

class KeyBoard implements USB {

    @Override
    public void openDevice() {
        System.out.println("打开键盘");
    }

    @Override
    public void closeDevice() {
        System.out.println("关闭键盘");
    }

    public void inPut() {
        System.out.println("键盘输入");
    }
}

class Computer {
    public void powerOn() {
        System.out.println("接通电源");
    }

    public void powerOff() {
        System.out.println("关闭电源");
    }

    public void useDevice(USB device) {
        device.openDevice();

        if (device instanceof Mouse) {
            ((Mouse) device).clink();
        } else if (device instanceof KeyBoard) {
            ((KeyBoard) device).inPut();
        }

        device.closeDevice();
    }
}

public class Test {

    public static void main(String[] args) {
        //1.接口用 interface 关键字来修饰(且不能用非 public 权限修饰符修饰)
        //2.接口当中的成员属性默认是被 public static final 修饰的
        //3.接口当中的成员方法默认是被 public abstract 修饰的
        //4.接口当中的成员一般不加修饰符保持默认即可
        //5.接口中的方法也可以有方法体但此时必须加default 修饰
        //6.使用了接口的类必须重写对应接口当中的所有未被default 修饰的方法(被default修饰了的也可以重写)
        //  并且重写的方法必须用public修饰 如果不将所有未被default 修饰的方法重写则该类必须 用abstract修饰 使之成为 抽象类
        //7.接口不能被实例化 也不能提供构造方法 静态代码块 实例代码块

        Computer computer = new Computer();
        computer.powerOn();

        System.out.println("你最多可以使用：" + USB.MAX_DEVICES + " 个USB接口");
        computer.useDevice(new KeyBoard());
        computer.useDevice(new Mouse());

        computer.powerOff();
        /*
         * 接通电源
         * 你最多可以使用：5 个USB接口
         * 打开键盘
         * 键盘输入
         * 关闭键盘
         * 打开鼠标
         * 点击鼠标
         * 关闭鼠标
         * 关闭电源
         */
    }
}
